<?php
declare(strict_types=1);
// 
namespace app\pos_v1\controller;
class et99
{
    // et99锁身份认证php计算对比示例
    // MD5_HMAC Compute.
    function DigestComp($ClientDigest, $RandomData, $Password)
    {
        $iPad = "";
        for ($i = 0; $i < 64; $i++) {
            $iPad .= "6";
        }
        $oPad = "";
        for ($i = 0; $i < 64; $i++) {
            $oPad .= "\\";
        }
        $KLen = strlen($Password);
        $iResult = "";
        for ($i = 0; $i < 64; $i++) {
            if ($i < $KLen) {
                $iResult .= $iPad[$i] ^ $Password[$i];
            } else {
                $iResult .= $iPad[$i];
            }
        }
        $iResult .= $RandomData;
        $iResult = md5($iResult);
        $Test = $this->hexstr2array($iResult);
        $iResult = "";
        $Num = count($Test);
        for ($i = 0; $i < $Num; $i++) {
            $iResult .= chr($Test[$i]);
        }
        $oResult = "";
        for ($i = 0; $i < 64; $i++) {
            if ($i < $KLen) {
                $oResult .= $oPad[$i] ^ $Password[$i];
            } else {
                $oResult .= $oPad[$i];
            }
        }
        $oResult .= $iResult;
        $Result = md5($oResult);
        $Result = strtoupper($Result); //把所有字符串转换为大写
        $ClientDigest = strtoupper($ClientDigest); //把所有字符串转换为大写
        // $Result = strtolower($Result);//把所有字符串转换为小写
        // $ClientDigest = strtolower($ClientDigest);//把所有字符串转换为小写
        $rdb = [
            // print "测试：服务器计算结果 [$Result]<BR>";
            "iPad:>>>>>>" => $iPad,
            "oPad:>>>>>>" => $oPad,
            "KLen:>>>>>>" => $KLen,
            // "iResult:>>>>>>" =>  $iResult,
            // "oResult:>>>>>>" =>  $oResult,
            "serverdigest[服务计算结果]:>>>>>>" => $Result,
            "ClientDigest[硬件计算结果]:>>>>>>" => $ClientDigest,
            "Random[随机数]:" => $RandomData,
            "OK" => "false"
        ];
        //服务与硬件计算结果对比
        if ($Result == $ClientDigest) {
            // return true;
            $rdb["OK"] = "true";
        } else {
            // return false;
            $rdb["OK"] = "false";
        }
        return $rdb;
    }
    function hexstr2array($HexStr)
    {
        $HEX = "0123456789ABCDEF";
        $Str = strtoupper($HexStr); //转换为大写
        $Len = strlen($Str); //字符串的长度
        for ($i = 0; $i < $Len / 2; $i++) {
            $NumHigh = strpos($HEX, $Str[$i * 2]); //查找字符串在另一字符串中第一次出现的位置（区分大小写）
            $NumLow = strpos($HEX, $Str[$i * 2 + 1]);
            $Ret[] = $NumHigh * 16 + $NumLow;
        }
        return $Ret;
    }
    public function index()
    {
        // $RandomData = substr("" . md5("" . time()) . md5("" . time()), 0, 32);
        // $RandomData = substr(md5());
        // PID 1C44DFCF
        $Digest = "30CE71A73BDD908C3955A90E8F7429EF"; //硬件计算结果
        $query = request()->param(); //请求参数
        // $Digest = $query["randomresult"];
        $RandomData = "123456"; //计算原文-用于对比
        $Password = "123456"; //USB-KEY密钥区内1-8个索引的计算密钥，密钥区内数据只能写不能读，计算时要使用索引选择密钥块。USB-KEY和服务器数据库各一份用于对比。
        // USB-KEY计算后，把原文和密文发到后台，后台拿原文和密钥计算，两密文对比。（【USB-KEY：原文+密钥索引=密文】【服务器：原文+密钥=密文】）
        $cc = $this->DigestComp($Digest, $RandomData, $Password);
        $apidb = [
            // 'code' => $code, //状态码
            'time' => time(), //
            'time2' => date("Y-m-d H:i:s", time()), //
            'msg' => "状态信息", //状态信息
            'query' => request()->param(), //请求参数
            // 'db' => $this->hexstr2array("dsafddsafffffffffffffffffsafsf"),
            'db2' => $cc,
        ];
        return (json($apidb));
    }
   
}
